package com.test.ad.demo.util;

import android.content.Context;
import android.content.SharedPreferences;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.test.ad.demo.bean.AdType;
import com.test.ad.demo.model.AdModel;

import java.lang.reflect.Type;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;


// 广告数据缓存工具类
public class AdCacheUtil {
    private static final String PREF_NAME = "ad_cache";
    private static final String KEY_AD_LIST = "ad_list";
    private static final String KEY_NEXT_ID = "next_id";

    private SharedPreferences preferences;
    private Gson gson;
    private SimpleDateFormat dateFormat;
    private DecimalFormat coinsFormat;

    public AdCacheUtil(Context context) {
        preferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        gson = new Gson();
        dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        // 设置时区为东八区（北京时间）
        dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        coinsFormat = new DecimalFormat("#.##"); // 保留两位小数
    }

    // 插入广告数据（自动生成当前时间）
    public boolean insertAd(AdType type, double coins) {
        String currentDate = dateFormat.format(new Date());
        return insertAd(type, coins, currentDate);
    }

    // 插入广告数据（自定义时间）
    public boolean insertAd(AdType type, double coins, String date) {
        List<AdModel> adList = getAllAds();
        int nextId = preferences.getInt(KEY_NEXT_ID, 1);

        AdModel newAd = new AdModel(nextId, type, coins, date);
        adList.add(newAd);

        // 保存更新后的列表
        String json = gson.toJson(adList);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(KEY_AD_LIST, json);
        editor.putInt(KEY_NEXT_ID, nextId + 1);
        return editor.commit();
    }

    // 获取所有广告数据
    public List<AdModel> getAllAds() {
        String json = preferences.getString(KEY_AD_LIST, "[]");
        Type type = new TypeToken<List<AdModel>>(){}.getType();
        List<AdModel> result = gson.fromJson(json, type);
        return result != null ? result : new ArrayList<AdModel>();
    }

    // 根据ID查询广告
    public AdModel getAdById(int id) {
        List<AdModel> adList = getAllAds();
        for (AdModel ad : adList) {
            if (ad.getId() == id) {
                return ad;
            }
        }
        return null;
    }

    // 根据类型查询广告
    public List<AdModel> getAdsByType(AdType type) {
        List<AdModel> result = new ArrayList<>();
        List<AdModel> adList = getAllAds();
        for (AdModel ad : adList) {
            if (ad.getType() == type) {
                result.add(ad);
            }
        }
        return result;
    }

    // 根据日期查询广告
    public List<AdModel> getAdsByDate(String date) {
        List<AdModel> result = new ArrayList<>();
        List<AdModel> adList = getAllAds();
        for (AdModel ad : adList) {
            if (date.equals(ad.getDate().split(" ")[0])) {
                result.add(ad);
            }
        }
        return result;
    }

    // 获取今天的广告数据
    public List<AdModel> getTodayAds() {
        String today = dateFormat.format(new Date());
        return getAdsByDate(today);
    }

    // 删除指定ID的广告
    public boolean deleteAd(int id) {
        List<AdModel> adList = getAllAds();
        for (int i = 0; i < adList.size(); i++) {
            if (adList.get(i).getId() == id) {
                adList.remove(i);

                // 保存更新后的列表
                String json = gson.toJson(adList);
                SharedPreferences.Editor editor = preferences.edit();
                editor.putString(KEY_AD_LIST, json);
                return editor.commit();
            }
        }
        return false;
    }

    // 清空所有广告数据
    public boolean clearAllAds() {
        SharedPreferences.Editor editor = preferences.edit();
        editor.remove(KEY_AD_LIST);
        editor.putInt(KEY_NEXT_ID, 1);
        return editor.commit();
    }

    // 获取广告数量
    public int getAdCount() {
        return getAllAds().size();
    }

    // 获取今天的广告数量
    public int getTodayAdCount() {
        return getTodayAds().size();
    }

    // 获取指定类型的广告数量
    public int getAdCountByType(AdType type) {
        return getAdsByType(type).size();
    }

    // 获取所有广告类型的显示名称数组
    public String[] getAdTypeDisplayNames() {
        AdType[] types = AdType.values();
        String[] names = new String[types.length];
        for (int i = 0; i < types.length; i++) {
            names[i] = types[i].getDisplayName();
        }
        return names;
    }

    // 根据显示名称获取广告类型
    public AdType getAdTypeFromDisplayName(String displayName) {
        return AdType.fromDisplayName(displayName);
    }

    // 获取总收益数（保留两位小数）
    public double getTotalCoins() {
        List<AdModel> adList = getAllAds();
        double total = 0.0;
        for (AdModel ad : adList) {
            total += ad.getCoins();
        }
        return Double.parseDouble(coinsFormat.format(total));
    }

    // 获取今收益币数（保留两位小数）
    public double getTodayCoins() {
        List<AdModel> todayAds = getTodayAds();
        double total = 0.0;
        for (AdModel ad : todayAds) {
            total += ad.getCoins();
        }
        return Double.parseDouble(coinsFormat.format(total));
    }

    // 获取指定类型的收益数（保留两位小数）
    public double getCoinsByType(AdType type) {
        List<AdModel> ads = getAdsByType(type);
        double total = 0.0;
        for (AdModel ad : ads) {
            total += ad.getCoins();
        }
        return Double.parseDouble(coinsFormat.format(total));
    }

    // 格式化收益数值（保留两位小数）
    public String formatCoins(double coins) {
        return coinsFormat.format(coins);
    }
}